package com.ewcms.personal.message.service;

import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import com.ewcms.personal.message.entity.Message;
import com.ewcms.personal.message.entity.MessageState;

/**
 *
 * @author wu_zhijun
 */
public interface MessageApi {

	public static final String REPLAY_PREFIX = "回复:";
	public static final String FOWRARD_PREFIX = "转发:";
	public static final String FOWRARD_TEMPLATE = "<br/><br/>----------转发消息----------<br/>发件人:%s<br/>收件人:%s<br/>标题:%s<br/><br/>%s";
	
	/**
	 * 得到用户指定状态的消息
	 * 
	 * @param userId
	 * @param state
	 * @param pageable
	 * @return
	 */
	public Page<Message> findUserMessage(Long userId, MessageState state, Pageable pageable);
	
	/**
	 * 查询消息的祖先和后代
	 * 
	 * @param message
	 * @return
	 */
	List<Message> findAncestorsAndDescendants(Message message);
	
	/**
	 * 保存草稿
	 * 
	 * @param message
	 */
	void saveDraft(Message message);
	
	/**
	 * 发送消息
	 * 
	 * @param message
	 */
	public void send(Message message);
	
	/**
	 * 发送系统消息给多人
	 * 
	 * @param receiverIds
	 * @param message
	 */
	public void sendSystemMessage(Long[] receiverIds, Message message);
	
	/**
	 * 发送系统消息给所有人
	 * 
	 * @param message
	 */
	public void sendSystemMessageToAllUser(Message message);
	
	/**
	 * 将消息移动到垃圾箱
	 * 
	 * @param userId
	 * @param messageId
	 */
	public void recycle(Long userId, Long messageId);
	
	/**
	 * 批量将消息移动到垃圾箱
	 * 
	 * @param userId
	 * @param messageIds
	 */
	public void recycle(Long userId, Long[] messageIds);
	
	/**
	 * 将消息保存到收藏箱
	 * @param userId
	 * @param messageId
	 */
	public void store(Long userId, Long messageId);
	
	/**
	 * 批量将消息保存到收藏箱
	 * 
	 * @param userId
	 * @param messageIds
	 */
	public void store(Long userId, Long[] messageIds);
	
	/**
	 * 从垃圾箱删除消息
	 * 
	 * @param userId
	 * @param messageId
	 */
	public void delete(Long userId, Long messageId);
	
	/**
	 * 批量从垃圾箱删除消息
	 * 
	 * @param userId
	 * @param messageIds
	 */
	public void delete(Long userId, Long[] messageIds);
	
	/**
	 * 清空指定状态的消息
	 * 
	 * @param userId
	 * @param state
	 */
	public void clearBox(Long userId, MessageState state);
	
	/**
	 * 消空草稿箱
	 * 
	 * @param userId
	 */
	public void clearDraftBox(Long userId);
	
	/**
	 * 消空收件箱
	 * 
	 * @param userId
	 */
	public void clearInBox(Long userId);
	
	/**
	 * 清空收件箱
	 * 
	 * @param userId
	 */
	public void clearOutBox(Long userId);
	
	/**
	 * 清空收藏箱
	 * 
	 * @param userId
	 */
	public void clearStoreBox(Long userId);
	
	/**
	 * 清空垃圾箱
	 * 
	 * @param userId
	 */
	public void clearTrashBox(Long userId);
	
	/**
	 * 未读收件箱消息总数
	 * 
	 * @param userId
	 * @return
	 */
	public Long countUnread(Long userId);
	
	/**
	 * 标识为已读
	 * 
	 * @param message
	 */
	public void markRead(Message message);
	
	/**
	 * 标识为已回复
	 * 
	 * @param message
	 */
	public void markReplied(Message message);
	
	/**
	 * 批量标识为已读
	 * 
	 * @param userId
	 * @param ids
	 */
	void markRead(Long userId, Long[] ids);
}
